package model;

import hbtDAO.HibernateCategoriaDAO;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import beans.CategoriaView;
import beans.DiccionarioView;
import beans.TemaView;

@Entity
@Table(name="Categoria")
public class Categoria {
	@Id
	@Column(name="Id_Categoria")
	//@GeneratedValue(strategy = GenerationType.AUTO)
	private Long idCategoria;
	
	@Column(name="Nombre", length=50)
	private String nombre;
	
	@Column(name="Descripcion",length=200)
	private String descripcion;
	
	@Column(name="Fecha_Creacion")
	private Date fechaCreacion;
	
	@ManyToMany
	(cascade=CascadeType.PERSIST,fetch=FetchType.EAGER)
	@JoinTable(
	        name="Categoria_Diccionario",
	        joinColumns={@JoinColumn(name="Id_Categoria")},
	        inverseJoinColumns={@JoinColumn(name="Id_Diccionario")})
	private List<Diccionario> diccionarios;
	
	/*@OneToMany
	(cascade = {CascadeType.PERSIST, CascadeType.REMOVE })
	@JoinTable(
	        name="Categoria_Tema",
	        joinColumns={@JoinColumn(name="Id_Categoria")},
	        inverseJoinColumns={@JoinColumn(name="Id_Tema")})
	*/
	
	@OneToMany
	//(cascade=CascadeType.PERSIST,fetch=FetchType.EAGER)
	@JoinColumn(name="Id_Categoria")
	private List<Tema> temas;
	
	
	public Categoria() {
		super();
		this.diccionarios = new ArrayList<Diccionario>();
		this.temas = new ArrayList<Tema>();
	}
	
	public Categoria(Long idCategoria, String nombre, String descripcion,
			Date fechaCreacion, List<Diccionario> diccionarios, List<Tema> temas) {
		super();
		this.idCategoria = idCategoria;
		this.nombre = nombre;
		this.descripcion = descripcion;
		this.fechaCreacion = fechaCreacion;
		this.diccionarios = diccionarios;
		this.temas = temas;
	}
	
	public Long getIdCategoria() {
		return idCategoria;
	}
	public void setIdCategoria(Long idCategoria) {
		this.idCategoria = idCategoria;
	}
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public String getDescripcion() {
		return descripcion;
	}
	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}
	public Date getFechaCreacion() {
		return fechaCreacion;
	}
	public void setFechaCreacion(Date fechaCreacion) {
		this.fechaCreacion = fechaCreacion;
	}
	public List<Diccionario> getDiccionarios() {
		return diccionarios;
	}
	public void setDiccionarios(List<Diccionario> diccionarios) {
		this.diccionarios = diccionarios;
	}
	public List<Tema> getTemas() {
		return temas;
	}
	public void setTemas(List<Tema> temas) {
		this.temas = temas;
	}
	
	
	public CategoriaView getView()
	{
		List<DiccionarioView> dicc= new ArrayList<DiccionarioView>();
		if( getDiccionarios()!=null){
			for(Diccionario item:  getDiccionarios()){
				dicc.add(item.getView());
			}
		}
		List<TemaView> te = new ArrayList<TemaView>();
		if( getTemas()!=null){
			for(Tema item:  getTemas()){
				te.add(item.getView());
			}
		}
		
		CategoriaView c = new CategoriaView(
				this.getIdCategoria(), 
				this.getNombre(), 
				this.getDescripcion(), 
				this.getFechaCreacion(), 
				dicc, 
				te
				);  
		
		return c;
		
	}

	@Override
	public String toString() {
		return "Categoria [idCategoria=" + idCategoria + ", nombre=" + nombre
				+ ", descripcion=" + descripcion + ", fechaCreacion="
				+ fechaCreacion + "]";
	}

	public void persistir() {
		HibernateCategoriaDAO.getInstancia().guardarUnCategoria(this);		
	}

	public boolean eliminarTema(Tema tem) {
		for(Tema item:  this.getTemas()){
			if(item.getIdTema()== tem.getIdTema())
			{
				this.temas.remove(tem);
				persistir();
				return true;
			}
		}
		return false;
	}
	
	
}
